package com.mpsc.api.unit;

import java.lang.reflect.Field;
import java.util.Date;
import java.util.Map;

public class ReflexUtil {

    /**
     * 获取主键
     *
     * @param clx 类的class
     * @param id  主键字段
     * @return
     */
    public static Object getPrimary(Class clx, String id) throws NoSuchFieldException, IllegalAccessException {
        Field primary = clx.getClass().getDeclaredField("id");
        primary.setAccessible(true);
        //Object p = primary.get(clx);
        return primary.get(clx);
    }

    /**
     * @describe 例:map中有key为"id",value为"001"的数据,类对象为User,User中有Spring id;属性,
     * 返回值:返回User对象,你将获得一个id属性为"001"的User对象
     */
    public static <T> T mapToPOJO(Map map, Class<T> clazz) throws Exception {
        //通过class对象拿到所有的字段(包括私有)
        Field[] declaredFields = clazz.getDeclaredFields();
        //通过class对象拿到实例对象,虽然此时它是Object类型
        T t = clazz.newInstance();
        //循环Field[]拿到每个属性对象
        for (Field field : declaredFields) {
            //打开属性对象的赋值权限
            field.setAccessible(true);
            if (map.get(field.getName()) != null) {
                //然后通过map.get(field.getName())取到map里面的值field.set()进实例对象
                if (field.getType() == Date.class) {
                    Object date = DateUtil.longToDate((Long) map.get(field.getName()));
                    field.set(t, date);
                } else {
                    field.set(t, map.get(field.getName()));
                }

            }
        }
        //我们把Object转成泛型返回
        return t;
    }
}
